package com.dp1.deliversoft.algorithm;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;

import com.dp1.deliversoft.entidad.CeldaAux;
import com.dp1.deliversoft.entidad.Constantes;
import com.dp1.deliversoft.entidad.Pedido;

public class Calculos {

	public static int CalcDistanciaEnKm(int o_x, int o_y, int d_x, int d_y) {
		return Math.abs(o_x - d_x) + Math.abs(o_y - d_y);
	}

	public static double calcularCostoRuta(ArrayList<Pedido> S) {
		int o_x, o_y, d_x, d_y = 0;
		double costofinal = 0;

		for (int i = 0; i < S.size() - 1; i++) {
			o_x = S.get(i).getPosX();
			o_y = S.get(i).getPosY();
			d_x = S.get(i + 1).getPosX();
			d_y = S.get(i + 1).getPosY();
			costofinal += Math.abs(o_x - d_x) + Math.abs(o_y - d_y);
		}
		return costofinal;
	}

	/*public static int funcionProbabilisticaHormigas(int indice, int ub_actualX, int ub_actualY, int clave, Hashtable<Integer, Hashtable<Integer, CeldaAux>> tbRuteo, ArrayList<Integer> casasPorVisitar)
	{ 
		Hashtable<Integer, CeldaAux> tbSubRuteo;
		
		Enumeration<Integer> e2;
		Integer clave2;
		CeldaAux celda;
		double suma;
			
		tbSubRuteo = tbRuteo.get(clave);

		e2 = tbSubRuteo.keys();
		
		for (int i=0; i<casasPorVisitar.size(); i++)
		{
			//suma = suma + calcular(clave );
		}

		while (e2.hasMoreElements()) {
			clave2 = e2.nextElement(); //primero lee el almacen en clave2 = 0
			celda = tbSubRuteo.get(clave2);
			celda.getFeromonas();
			celda.getVisiAlaBbeta();
			
			
			//if (celda.getPosA_ArregloPedidos()== 1 )
			
		}
		
		return 1;
	}*/


	public static double Redondear(double numero,int digitos)
	{
	      int cifras=(int) Math.pow(10,digitos);
	      return Math.rint(numero*cifras)/cifras;
	}
	

	public static double FuncionDecisionGrasp(int distancia, double plazo, int tipoVehiculo) {

		// f(distancia,plazo)=5*distancia+200*(max((distacia/veloc min)-plazo,0)
		/*return (Constantes.costoCombustibleAuto * distancia + 10
				* Constantes.costoRetraso
				* (Math.max(0, (distancia / Constantes.velocidadAuto) - plazo)));*/
		double costokm,costoretraso;
		
		if (tipoVehiculo==Constantes.tipoAuto)
		{
			costokm=distancia*Constantes.costoCombustibleAuto;
			costoretraso=Math.max((distancia/Constantes.velocidadAuto)-plazo,0)*Constantes.costoRetraso;
		}
		else
		{
			costokm=distancia*Constantes.costoCombustibleMoto;
			costoretraso=Math.max((distancia/Constantes.velocidadMoto)-plazo,0)*Constantes.costoRetraso;
		}
		
		return (costokm+costoretraso);
	}
	
	public static double FuncionDecisionGraspAnterior(int distancia, double plazo) {
		// f(distancia,plazo)=5*distancia+200*(max((distacia/veloc min)-plazo,0)
				return (Constantes.costoCombustibleAuto * distancia + 10
						* Constantes.costoRetraso
						* (Math.max(0, (distancia / Constantes.velocidadAuto) - plazo)));
			
	}
}
